package com.mj.order;

import com.mj.utils.Util;
import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.remoting.exception.RemotingException;

import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * 顺序消息，每次按顺序发送到一个queue
 */
public class OrderProducer {
    public static void main(String[] args) throws MQClientException, MQBrokerException, RemotingException, InterruptedException {
        // 1.创建一个DefaultMQProducer实例，指定生产者组名
        DefaultMQProducer producer = new DefaultMQProducer(Util.ProducerGroup);
        // 2.设置NameServer的地址
        producer.setNamesrvAddr(Util.NamesrvAddr);
        // 3.启动生产者实例
        producer.start();
        // 4.使用for循环发送10条消息
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 10; j++) {
                // 创建一条消息，指定Topic为"MyTopic1"，Tag标签为"TagA"，消息体为"hello rocketmq"加上循环变量的值，同时把字符串转换为字节数组
                Message message = new Message(Util.Topic, "TagA", ("order_" + i + "_step_" + j).getBytes(StandardCharsets.UTF_8));
                // 5.发送消息并接收发送结果
                SendResult sendResult = producer.send(message, new MessageQueueSelector() {
                    @Override
                    public MessageQueue select(List<MessageQueue> list, Message message, Object o) {
                        //这里的o就是外面循环里的i，返回值就是确定的第几个queue，list.size默认是4，部署mq的时候可以通过配置文件进行修改
                        Integer id = (Integer) o;
                        int index = id % list.size();
                        return list.get(index);
                    }
                }, i);
                // 打印发送结果，包括消息ID、发送状态等信息
                System.out.println(sendResult);
            }
        }
        // 6.发送完所有消息后，关闭生产者实例，释放资源
        producer.shutdown();

    }
}
